home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 23 / AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso / Tools / Packer / xad / Developer / Sources / clients / xMash.c < prev    next >
C/C++ Source or Header  |  1999-11-06  |  5KB  |  208 lines

  1. #ifndef XADMASTER_XMASH_C
  2. #define XADMASTER_XMASH_C
  3.  
  4. /* Programmheader
  5.  
  6.     Name:        xMash.c
  7.     Main:        xadmaster
  8.     Versionstring:    $VER: xMash.c 1.0 (05.09.1998)
  9.     Author:        SDI
  10.     Distribution:    Freeware
  11.     Description:    xMash disk archiver client
  12.  
  13.  1.0   05.09.98 : first version
  14. */
  15.  
  16. #include <proto/xadmaster.h>
  17. #include "SDI_compiler.h"
  18. #include "xpkstuff.c"
  19.  
  20. #ifndef XADMASTERFILE
  21. #define xMash_Client        FirstClient
  22. #define NEXTCLIENT        0
  23. UBYTE version[] = "$VER: xMash 1.0 (05.09.1998)";
  24. #endif
  25. #define XMASH_VERSION        1
  26. #define XMASH_REVISION        0
  27.  
  28. /*
  29.   structure of one xMash chunk:
  30.     UBYTE        xmc_Type;
  31.     UBYTE        xmc_Start
  32.     UBYTE        xmc_Num;
  33.     ULONG        xmc_Size;
  34. */
  35.  
  36. #define XMASH_INFOTEXT    0x46
  37. #define XMASH_BANNER    0x42
  38. #define XMASH_ARCHIVE    0x44
  39.  
  40. struct xMashHead {
  41.   UBYTE    type;
  42.   UBYTE start;
  43.   UBYTE num;
  44. };
  45.  
  46. ASM(BOOL) xMash_RecogData(REG(d0, ULONG size), REG(a0, STRPTR data),
  47. REG(a6, struct xadMasterBase *xadMasterBase))
  48. {
  49.   if(data[0] == 'M' && data[1] == 'S' && data[2] == 'H' &&
  50.   (data[3] == XMASH_BANNER || data[3] == XMASH_ARCHIVE || data[3] ==
  51.   XMASH_INFOTEXT))
  52.     return 1;
  53.   else
  54.     return 0;
  55. }
  56.  
  57. ASM(LONG) xMash_GetInfo(REG(a0, struct xadArchiveInfo *ai),
  58. REG(a6, struct xadMasterBase *xadMasterBase))
  59. {
  60.   LONG err, lowcyl = 80, highcyl = -1;
  61.   ULONG dat[9], start = 3;
  62.   struct xadDiskInfo *xdi;
  63.   struct xMashHead h;
  64.  
  65.   if(!(xdi = (struct xadDiskInfo *) xadAllocObjectA(XADOBJ_DISKINFO, 0)))
  66.     return XADERR_NOMEMORY;
  67.   ai->xai_DiskInfo = xdi;
  68.  
  69.   xdi->xdi_EntryNumber = 1;
  70.   xdi->xdi_SectorSize = 512;
  71.   xdi->xdi_Cylinders = 80;
  72.   xdi->xdi_Heads = 2;
  73.   xdi->xdi_TrackSectors = 11;
  74.   xdi->xdi_CylSectors = 22;
  75.   xdi->xdi_TotalSectors = 80 * 22;
  76.  
  77.   if((err = xadHookAccess(XADAC_INPUTSEEK, 3, 0, ai))) /* skip MSH */
  78.     return err;
  79.  
  80.   while(ai->xai_InPos < ai->xai_InSize && !err)
  81.   {
  82.     if(!(err = xadHookAccess(XADAC_READ, 3, &h, ai)) &&
  83.     !(err = xadHookAccess(XADAC_READ, 4, dat, ai)))
  84.     {
  85.       switch(h.type)
  86.       {
  87.       case XMASH_INFOTEXT:
  88.         err = xpkDecrunch(&xdi->xdi_InfoText, &xdi->xdi_InfoTextSize, ai,
  89.         xadMasterBase);
  90.         xdi->xdi_Flags |= XADDIF_INFOTEXT;
  91.         start = ai->xai_InPos;
  92.         break;
  93.       case XMASH_BANNER:
  94.         err = xpkDecrunch(&xdi->xdi_Banner, &xdi->xdi_BannerSize, ai,
  95.         xadMasterBase);
  96.         xdi->xdi_Flags |= XADDIF_BANNER;
  97.         start = ai->xai_InPos;
  98.         break;
  99.       case XMASH_ARCHIVE:
  100.         if(!(err = xadHookAccess(XADAC_READ, 36, dat, ai)) &&
  101.         !(err = xadHookAccess(XADAC_INPUTSEEK, dat[1]-28, 0, ai)))
  102.         {
  103.           if(dat[8] & (1<<25))
  104.           { /* check for password flag in every entry */
  105.             ai->xai_Flags |= XADAIF_CRYPTED;
  106.             xdi->xdi_Flags |= XADDIF_CRYPTED;
  107.           }
  108.           h.num = ((h.num+h.start) >> 1)-1;
  109.           h.start >>= 1;
  110.           if(h.start < lowcyl)
  111.             lowcyl = h.start;
  112.           if(h.num > highcyl)
  113.             highcyl = h.num;
  114.         }
  115.         break;
  116.       }
  117.     }
  118.   }
  119.  
  120.   if(lowcyl <= highcyl)
  121.   {
  122.     xdi->xdi_LowCyl  = lowcyl;
  123.     xdi->xdi_HighCyl = highcyl;
  124.   }
  125.   else
  126.     err = XADERR_INPUT;
  127.  
  128.   if(!err)
  129.     err = xadHookAccess(XADAC_INPUTSEEK, start-ai->xai_InPos, 0, ai);
  130.  
  131.   return err;
  132. }
  133.  
  134. ASM(LONG) xMash_UnArchive(REG(a0, struct xadArchiveInfo *ai),
  135. REG(a6, struct xadMasterBase *xadMasterBase))
  136. {
  137.   struct xMashHead h;
  138.   LONG err = 0, u;
  139.   ULONG size, lowcyl;
  140.   STRPTR a;
  141.   struct ExecBase * SysBase = xadMasterBase->xmb_SysBase;
  142.  
  143.   u = ai->xai_InPos;
  144.   lowcyl = ai->xai_LowCyl;
  145.  
  146.   while(!err && lowcyl <= ai->xai_HighCyl)
  147.   {
  148.     if(!(err = xadHookAccess(XADAC_READ, 3, &h, ai)) &&
  149.     !(err = xadHookAccess(XADAC_READ, 4, &size, ai)))
  150.     {
  151.       LONG endcyl, startcyl, skipbyte;
  152.  
  153.       startcyl = h.start>>1;
  154.       endcyl = ((h.start+h.num)>>1)-1;
  155.  
  156.       if(endcyl < lowcyl)
  157.         err = xadHookAccess(XADAC_INPUTSEEK, size, 0, ai);
  158.       else
  159.       {
  160.     ULONG size;
  161.         if(!(err = xpkDecrunch(&a, &size, ai, xadMasterBase)))
  162.         {
  163.       skipbyte = 0;
  164.  
  165.           if(startcyl < lowcyl)
  166.             skipbyte = (lowcyl-startcyl)*22*512;
  167.           if(endcyl > ai->xai_HighCyl)
  168.             endcyl = ai->xai_HighCyl;
  169.       size = (endcyl+1-lowcyl)*22*512;
  170.             
  171.           err = xadHookAccess(XADAC_WRITE, size, a+skipbyte, ai);
  172.           FreeVec(a);
  173.           lowcyl = endcyl+1;
  174.         }
  175.       }
  176.     }
  177.   }
  178.  
  179.   /* seek back to start */
  180.   if(!err)
  181.     err = xadHookAccess(XADAC_INPUTSEEK, u-ai->xai_InPos, 0, ai);
  182.  
  183.   return err;
  184. }
  185.  
  186. ASM(void) xMash_Free(REG(a0, struct xadArchiveInfo *ai),
  187. REG(a6, struct xadMasterBase *xadMasterBase))
  188. {
  189.   struct ExecBase * SysBase = xadMasterBase->xmb_SysBase;
  190.   if(ai->xai_DiskInfo)
  191.   {
  192.     if(ai->xai_DiskInfo->xdi_InfoText)
  193.       FreeVec(ai->xai_DiskInfo->xdi_InfoText);
  194.     if(ai->xai_DiskInfo->xdi_Banner)
  195.       FreeVec(ai->xai_DiskInfo->xdi_Banner);
  196.     xadFreeObjectA(ai->xai_DiskInfo, 0);
  197.     ai->xai_DiskInfo = 0; /* clear the entry */
  198.   }
  199. }
  200.  
  201. struct xadClient xMash_Client = {
  202. NEXTCLIENT, XADCLIENT_VERSION, 1, XMASH_VERSION, XMASH_REVISION, 3,
  203. XADCF_DISKARCHIVER, XADCID_XMASH, "xMash", (BOOL (*)()) xMash_RecogData,
  204. (LONG (*)()) xMash_GetInfo, (LONG (*)()) xMash_UnArchive,
  205. (void (*)()) xMash_Free};
  206.  
  207. #endif /* XADASTER_XMASH_C */
  208.